/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/* 
 * File:   PublicIPTool.h
 * Author: Administrator
 *处理跟IP有关的函数
 * Created on 2017年9月29日, 上午10:48
 */

#ifndef PUBLICIPTOOL_H
#define PUBLICIPTOOL_H
#ifdef __MINGW32__
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0701
#endif
#endif
#include<set>
#include<map>
#include<string>
#include<string.h>
#include<stdint.h>
#include<sys/time.h>
typedef std::set<std::string>SETIPLIST;//IP队列
typedef std::set<int>       SETPORTLIST;//ID队列
#ifdef __MINGW32__
//u_char
#include<_bsd_types.h>
#ifndef FD_SETSIZE
#define FD_SETSIZE	20480
#endif
#endif
//所有套接字相关由此衍生
char*sock_startup(void);
void sock_cleanup();

#define IP_FLAG_IPNULL  0x00
#define IP_FLAG_IPV4PRI 0x01
#define IP_FLAG_IPV4PUB 0x02
#define IP_FLAG_IPV4 (IP_FLAG_IPV4PRI|IP_FLAG_IPV4PUB)
#define IP_FLAG_IPV6PRI 0x10
#define IP_FLAG_IPV6PUB 0x20
#define IP_FLAG_IPV6 (IP_FLAG_IPV6PRI|IP_FLAG_IPV6PUB)
#define IP_FLAG_IPALL (IP_FLAG_IPV4|IP_FLAG_IPV6)

#define CHEKFLAGIPV4(flag) flag&(IP_FLAG_IPV4)
#define CHEKFLAGIPV6(flag) flag&(IP_FLAG_IPV6)

uint16_t hton16(uint16_t data);
uint32_t hton32(uint32_t data);
//获取0~randata间随机整数
uint32_t random(uint32_t randata);
//通过主机序获取IPV4
const char*GetIPByHostID(char*IP,uint32_t host);
const char*GetIPByHostIDV6(char*IP,uint8_t host[]);
//通过网络字节序获取IPV4
const char*GetIPByNetWorkID(char*IP,uint32_t net);
//声明留下,输出网络自己序
uint32_t inet_network_ex(const char*IP);
//IP相关
//根据IP跟子网掩码打印所有IPV4
void ShowAllIP(const char*IP,const char*Mask);
//设置是否判断内网IP
//默认过滤
void SetCheckLanIP(int bCheck);
//-1不是IP 4IPV4 6IPV6
int GetIPType(const char*ip);
//判断是否为IPV4 1是 0不是
int IsIPV4(const char*ip);
//是否是公网 1公网 0内网 -1IP有误
int IsPublicIPV4(const char*IP);
//判断是否为IPV6 1是 0不是
int IsIPV6(const char*ip);
//判断是否为FE80或FEC0开头 1是 0不是 -1不是IPV6
//开头为2000到3fff之间
//只判断首字节19到40
int IsPublicIPV6(const char*ip);
//判断是否支持IPV6 1支持 0不支持
//要求要有公网IP
int IsSupportIPV6();
//获取标准的IPV6
std::string GetSimpleIPV6(const char*ip);
//获取支持IPV6的网卡名称
//通常用于获取IPV6链路地址
const char*GetIPV6DeviceName(int ipflag=IP_FLAG_IPV6PRI);
//获取本地所有IP
//排除127.0.0.1
SETIPLIST GetLocalIPList(int ipflag=IP_FLAG_IPV4);
//优先返回所有公网IPV4
//无公网返回所有内网IPV4
SETIPLIST GetPublicIPList();
//获取一个可靠的本地IPV4
std::string GetMainLocalIP();
//PublicNet相关
//奇数偶数校验
uint16_t Check_SUM(uint16_t*data,int len);
//中断PublicNet的使用
void DisablePingThread();
//检查是否正常使用PublicNet库
//1正常，0不正常
int  EnablePingThread();
#endif /* PUBLICIPTOOL_H */

